/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package CONTROLES;

import INTERFAZ.Bienvenida;
import MODELOS.Cliente;
import MODELOS.Cuenta;
import MODELOS.PlanInversion;
import UTILITARIOS.EncriptarCadena;
import UTILITARIOS.Fecha;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;

import java.util.Formatter;

/**
 *
 * @author Administrador
 */
public class ControlCuenta {

    private Cuenta cuenta = new Cuenta();

    public ControlCuenta(){

    }
    public Cuenta getCuenta() {
        return cuenta;
    }
    public Cuenta getCuenta(int id){
       Conexion conection = new Conexion();
       Cuenta c= new Cuenta();
    try{
            Connection conectado = conection.getConexion();
            PreparedStatement psc = conectado.prepareStatement("select * from CUENTA where id_cuenta = '"+id+"'");
            ResultSet respEmp = psc.executeQuery();
            while (respEmp.next()){
                c.setIdCuenta(respEmp.getInt(1));
                c.setIdSucursal(respEmp.getInt(2));
                c.setIdCliente(respEmp.getInt(3));
                c.setIdPlan(respEmp.getInt(4));
                c.setNumeroCuenta(respEmp.getLong(5));
                c.setPorcentajeInteres(respEmp.getDouble(6));
                c.setMonto(respEmp.getDouble(7));
                c.setIdUsuario(respEmp.getInt(8));
                c.setFechaApretura(respEmp.getDate(9));
                c.setFechaFechaCierre(respEmp.getDate(10));
                c.setEstado(respEmp.getString(11));
                c.setModoPago(respEmp.getString(12));
                c.setIdRecibo(respEmp.getInt(13));
                String cod = new EncriptarCadena().Encriptar("nfn inversiones", respEmp.getString(14), false);
                c.setCodigoCuenta(Double.valueOf(cod));
            }
        }
            catch (SQLException e){
            System.out.println("error al recuperar la Cuenta: " + e.getLocalizedMessage());
        }
        return c;
    }
    public void setCuenta(Cuenta cuenta) {
        this.cuenta = cuenta;
    }

    public Cuenta registrarCuenta(Cuenta cuenta)
    {
       Conexion conection = new Conexion();
       int c = 0;
       try{
          Connection conectado = conection.getConexion();
          PlanInversion plan_inv = new ControlPlanInversion().damePlan(cuenta.getIdPlan());

          PreparedStatement ps1 = conectado.prepareStatement("select nextval('cuenta_id_cuenta_seq')");
          ResultSet respEmp = ps1.executeQuery();
          
            while (respEmp.next()){
                c = respEmp.getInt(1);
            }
          ps1.close();
          String sentencia = "";
          cuenta.setNumeroCuenta(generarNumeroCuenta(cuenta.getIdSucursal(), cuenta.getIdPlan(), c));
          int numPago = 0;
          Calendar fecha_p = Calendar.getInstance();
          for(int i=plan_inv.getFrecuenciaPago(); i<=plan_inv.getDuracion();i+=plan_inv.getFrecuenciaPago()){
              numPago++;
              fecha_p.setTime(cuenta.getFechaApertura());
              fecha_p.add(Calendar.MONTH, i);
              double monto_pago = cuenta.calcularMontoPago();
              sentencia = sentencia+"INSERT INTO pagos(id_pago, fecha_pago, monto, id_cuenta, id_usuario, id_sucursal, estado, numero_pago) VALUES (nextval('pagos_id_pago_seq'),'"+fecha_p.getTime()+"','"+ monto_pago +"','"+c+"','"+Bienvenida.user.getIdUsuario()+"','"+cuenta.getIdSucursal()+"','PENDIENTE','"+numPago+"');";
          }
          fecha_p.setTime(cuenta.getFechaApertura());
          fecha_p.add(Calendar.MONTH, plan_inv.getDuracion());

          String cod = new EncriptarCadena().Encriptar("nfn inversiones", String.valueOf(cuenta.getCodigoCuenta()), true);
          PreparedStatement ps = conectado.prepareStatement("INSERT INTO cuenta(id_cuenta, id_sucursal, numero_cuenta, id_cliente, id_plan, porcentaje, monto, fecha_apertura, fecha_cierre, estado, modo_pago, id_usuario, codigo_cuenta) VALUES ('"+c+"','"+cuenta.getIdSucursal()+"','"+ cuenta.getNumeroCuenta() +"','"+cuenta.getIdCliente()+"','"+cuenta.getIdPlan()+"','"+cuenta.getPorcentajeInteres()+"','"+cuenta.getMonto()+"','"+cuenta.getFechaApertura()+"','"+fecha_p.getTime()+"','"+cuenta.getEstado()+"','"+cuenta.getModoPago()+"','"+Bienvenida.user.getIdUsuario()+"','"+cod+"');"
                                                            + sentencia);
          ps.executeUpdate();
          ps.close();          
        }catch (SQLException em) {
            System.out.println("error al Registrar la cuenta en la base de datos "+em.getLocalizedMessage() );
            return null;
          }
       return getCuenta(c);
     }


    public boolean registrarCancelarCuenta(Cuenta cuenta)
    {
       Conexion conection = new Conexion();
       Date fecha = new Fecha().getFechaDate();
       try{
          Connection conectado = conection.getConexion();
            PreparedStatement ps =
                    conectado.prepareStatement("UPDATE Cuenta SET estado='CANCELADA', fecha_cierre = '"+fecha+"' WHERE id_cuenta = '"+cuenta.getIdCuenta()+"';"
                    + "UPDATE pagos SET estado='ANULADO', fecha_pago = '"+fecha+"' WHERE id_cuenta = '"+cuenta.getIdCuenta()+"' AND estado = 'PAGADO';"
                    + "UPDATE pagos SET estado='CANCELADO', modo_pago = '-------', fecha_pago = '"+fecha+"' WHERE id_cuenta = '"+cuenta.getIdCuenta()+"' AND estado = 'PENDIENTE';");
            ps.executeUpdate();
            ps.close();

        }catch (SQLException em) {
            System.out.println("Error al Registrar La cancelacion de la cuenta "+em.getLocalizedMessage());
            return false;
            }

        return true;
    }

    public ArrayList<Cuenta> getCuentas(Cliente cliente, String estado){
       Conexion conection = new Conexion();
       ArrayList<Cuenta> res = new ArrayList<Cuenta>();
       Cuenta c;
       try{
            Connection conectado = conection.getConexion();
            PreparedStatement psc = conectado.prepareStatement("select * from CUENTA where id_cliente = '"+cliente.getIdCliente()+"'AND estado ='"+estado+"' ORDER BY numero_cuenta ASC");
            ResultSet respEmp = psc.executeQuery();
            while (respEmp.next()){

                c= new Cuenta();
                c.setIdCuenta(respEmp.getInt(1));                
                c.setIdSucursal(respEmp.getInt(2));
                c.setIdCliente(respEmp.getInt(3));
                c.setIdPlan(respEmp.getInt(4));
                c.setNumeroCuenta(respEmp.getLong(5));
                c.setPorcentajeInteres(respEmp.getDouble(6));
                c.setMonto(respEmp.getDouble(7));
                c.setIdUsuario(respEmp.getInt(8));
                c.setFechaApretura(respEmp.getDate(9));
                c.setFechaFechaCierre(respEmp.getDate(10));
                c.setEstado(respEmp.getString(11));
                c.setModoPago(respEmp.getString(12));
                c.setIdRecibo(respEmp.getInt(13));
                String cod = new EncriptarCadena().Encriptar("nfn inversiones", respEmp.getString(14), false);
                c.setCodigoCuenta(Double.valueOf(cod));

                res.add(c);
            }
        }
            catch (SQLException e){
            System.out.println("error al recuperar lista de Cuentas " + e.getLocalizedMessage());
        }

        return res;
    }

    public ArrayList<Cuenta> getInversionesPorConcluir(int idSucursal, Date fechaI, Date fechaF) {
       Conexion conection = new Conexion();
       ArrayList<Cuenta> res = new ArrayList<Cuenta>();
       Cuenta c;
       try{
            Connection conectado = conection.getConexion();
            PreparedStatement psc = conectado.prepareStatement("select * from CUENTA where id_sucursal = '"+idSucursal+"' AND fecha_cierre >= '"+fechaI+"' AND fecha_cierre <= '"+fechaF+"' AND estado ='ACTIVA' ORDER BY fecha_cierre ASC");
            ResultSet respEmp = psc.executeQuery();
            while (respEmp.next()){

                c= new Cuenta();
                c.setIdCuenta(respEmp.getInt(1));
                c.setIdSucursal(respEmp.getInt(2));
                c.setIdCliente(respEmp.getInt(3));
                c.setIdPlan(respEmp.getInt(4));
                c.setNumeroCuenta(respEmp.getLong(5));
                c.setPorcentajeInteres(respEmp.getDouble(6));
                c.setMonto(respEmp.getDouble(7));
                c.setIdUsuario(respEmp.getInt(8));
                c.setFechaApretura(respEmp.getDate(9));
                c.setFechaFechaCierre(respEmp.getDate(10));
                c.setEstado(respEmp.getString(11));
                c.setModoPago(respEmp.getString(12));
                c.setIdRecibo(respEmp.getInt(13));
                String cod = new EncriptarCadena().Encriptar("nfn inversiones", respEmp.getString(14), false);
                c.setCodigoCuenta(Double.valueOf(cod));

                res.add(c);
            }
        }
            catch (SQLException e){
            System.out.println("error al recuperar lista de Cuentas " + e.getLocalizedMessage());
        }
        return res;
    }

    //recibe el id de la sucursal y el id del plan
    public Long generarNumeroCuenta(int id_c, int id_plan,int id){

        Formatter fmt = new Formatter();
        fmt.format("%03d%03d", id_c, id_plan);
        
        return Long.valueOf(fmt.toString()+Integer.toString(id));
    }

    public static void main (String args [])
    {
        ControlCuenta con = new ControlCuenta();
        ControlCliente c = new ControlCliente();
        ArrayList<Cuenta> list = new ArrayList<Cuenta>();
        list = con.getCuentas(c.dameCliente(1), "ACTIVA");
        System.out.println(list.size());
    }

    public ArrayList<Cuenta> getInversionesCerradas(int idSucursal, Date fechaI, Date fechaF, int id_user) {
       Conexion conection = new Conexion();
       ArrayList<Cuenta> res = new ArrayList<Cuenta>();
       Cuenta c;
       try{
            Connection conectado = conection.getConexion();
            PreparedStatement psc;
            if(id_user != 0)
                psc = conectado.prepareStatement("select * from CUENTA where id_sucursal = '"+idSucursal+"' AND fecha_cierre >= '"+fechaI+"' AND fecha_cierre <= '"+fechaF+"' AND (estado ='CERRADA' OR estado ='CANCELADA') AND id_usuario = '"+id_user+"' ORDER BY fecha_cierre ASC");
            else
                psc = conectado.prepareStatement("select * from CUENTA where id_sucursal = '"+idSucursal+"' AND fecha_cierre >= '"+fechaI+"' AND fecha_cierre <= '"+fechaF+"' AND (estado ='CERRADA' OR estado ='CANCELADA') ORDER BY fecha_cierre ASC");
            ResultSet respEmp = psc.executeQuery();
            while (respEmp.next()){

                c= new Cuenta();
                c.setIdCuenta(respEmp.getInt(1));
                c.setIdSucursal(respEmp.getInt(2));
                c.setIdCliente(respEmp.getInt(3));
                c.setIdPlan(respEmp.getInt(4));
                c.setNumeroCuenta(respEmp.getLong(5));
                c.setPorcentajeInteres(respEmp.getDouble(6));
                c.setMonto(respEmp.getDouble(7));
                c.setIdUsuario(respEmp.getInt(8));
                c.setFechaApretura(respEmp.getDate(9));
                c.setFechaFechaCierre(respEmp.getDate(10));
                c.setEstado(respEmp.getString(11));
                c.setModoPago(respEmp.getString(12));
                c.setIdRecibo(respEmp.getInt(13));
                String cod = new EncriptarCadena().Encriptar("nfn inversiones", respEmp.getString(14), false);
                c.setCodigoCuenta(Double.valueOf(cod));

                res.add(c);
            }
        }
            catch (SQLException e){
            System.out.println("error al recuperar lista de Cuentas CERRADAS " + e.getLocalizedMessage());
        }
        return res;
    }

    public double getTotalNuevasInversiones(int idSucursal, Date fecha){
       Conexion conection = new Conexion();
       double total = 0.0;
       try{
            Connection conectado = conection.getConexion();
            PreparedStatement psc = conectado.prepareStatement("SELECT sum(monto) AS cuenta_monto FROM cuenta WHERE fecha_apertura = '"+fecha+"' AND id_sucursal = '"+idSucursal+"'");
            ResultSet respEmp = psc.executeQuery();
            if(respEmp.next()){
                total = respEmp.getDouble(1);
           }
        }catch (SQLException e){
            System.out.println("error al recuperar el total de las Cuentas NUEVAS " + e.getLocalizedMessage());
        }
        return total;
    }

    public double getTotalInversionesCerradas(int idSucursal, Date fecha){
       Conexion conection = new Conexion();
       double total = 0.0;
       try{
            Connection conectado = conection.getConexion();
            PreparedStatement psc = conectado.prepareStatement("SELECT sum(monto) AS cuenta_monto FROM cuenta WHERE fecha_cierre = '"+fecha+"' AND id_sucursal = '"+idSucursal+"' AND estado ='CERRADA' ");
            ResultSet respEmp = psc.executeQuery();
            if(respEmp.next()){
                total = respEmp.getDouble(1);
           }
        }catch (SQLException e){
            System.out.println("error al recuperar el total de las Cuentas CERRADAS " + e.getLocalizedMessage());
        }
        return total;
    }

    public double getTotalInversionesCanceladas(int idSucursal, Date fecha){
       Conexion conection = new Conexion();
       double total = 0.0;
       try{
            Connection conectado = conection.getConexion();
            PreparedStatement psc = conectado.prepareStatement("SELECT sum(monto) AS cuenta_monto FROM cuenta WHERE fecha_cierre = '"+fecha+"' AND id_sucursal = '"+idSucursal+"' AND estado ='CANCELADA' ");
            ResultSet respEmp = psc.executeQuery();
            if(respEmp.next()){
                total = respEmp.getDouble("cuenta_monto");
           }
        }catch (SQLException e){
            System.out.println("error al recuperar el total de las Cuentas CERRADAS " + e.getLocalizedMessage());
        }
        return total;
    }


    public ArrayList<Cuenta> getInversionesNuevas(int idSucursal, Date fechaI, Date fechaF, int id_user) {
       Conexion conection = new Conexion();
       ArrayList<Cuenta> res = new ArrayList<Cuenta>();
       Cuenta c;
       try{
            Connection conectado = conection.getConexion();
            PreparedStatement psc;
            if(id_user != 0){
                psc = conectado.prepareStatement("select * from CUENTA where id_sucursal = '"+idSucursal+"' AND fecha_apertura >= '"+fechaI+"' AND fecha_apertura <= '"+fechaF+"' AND id_usuario = '"+id_user+"' ORDER BY fecha_apertura ASC");
            } else{
                psc = conectado.prepareStatement("select * from CUENTA where id_sucursal = '"+idSucursal+"' AND fecha_apertura >= '"+fechaI+"' AND fecha_apertura <= '"+fechaF+"' ORDER BY fecha_apertura ASC");
            }
            ResultSet respEmp = psc.executeQuery();
            while (respEmp.next()){

                c= new Cuenta();
                c.setIdCuenta(respEmp.getInt(1));
                c.setIdSucursal(respEmp.getInt(2));
                c.setIdCliente(respEmp.getInt(3));
                c.setIdPlan(respEmp.getInt(4));
                c.setNumeroCuenta(respEmp.getLong(5));
                c.setPorcentajeInteres(respEmp.getDouble(6));
                c.setMonto(respEmp.getDouble(7));
                c.setIdUsuario(respEmp.getInt(8));
                c.setFechaApretura(respEmp.getDate(9));
                c.setFechaFechaCierre(respEmp.getDate(10));
                c.setEstado(respEmp.getString(11));
                c.setModoPago(respEmp.getString(12));
                c.setIdRecibo(respEmp.getInt(13));
                String cod = new EncriptarCadena().Encriptar("nfn inversiones", respEmp.getString(14), false);
                c.setCodigoCuenta(Double.valueOf(cod));

                res.add(c);
            }
        }
            catch (SQLException e){
            System.out.println("error al recuperar lista de Cuentas NUEVAS " + e.getLocalizedMessage());
        }
        return res;
    }

    public boolean updateMetodoPago(int id_cuenta) {
        Conexion conection = new Conexion();
        try {
            Connection conectado = conection.getConexion();
            PreparedStatement ps =
            conectado.prepareStatement("UPDATE cuenta SET modo_pago='DEPOSITO BANCARIO' WHERE id_cuenta = '"+id_cuenta+"';");
            ps.executeUpdate();
            ps.close();
        } catch (SQLException em) {

            System.out.println("Error al actualizar El modo de pago de la cuenta a Deposito Bancario "+em.getLocalizedMessage() );
            return false;
        }
        return true;
    }
}